Problem s parametrem typu varArray
Otázka od: j.binder@albacon.cz
11. 8. 2004 13:20
Ahoj,
mam problem s volanim metody COM objektu pres ktery se nejak nemuzu prenest
(D7 Pro + Update).
Kdyby mi nekdo mohl poradit, byl bych moc vdecny.
Metoda je deklarovana
function Sense(var ReceiveData: OleVariant): Integer; dispid 17;
Receive Data ma byt buffer delky 77 bytu
Predopokladal jsem, ze bude fungovat toto:
procedure GetState;
var
Buf: OleVariant;
i: integer;
begin
Buf := VarArrayCreate([0..76], varByte);
for i := 0 to 76 do Buf[i] := 0;
Sense(Buf);
...
end;
Pri vystupu z procedury mi to hazi chybu
Variant or safe array is locked
V dokumentaci je metoda deklarovana
LONG Sense(VARIANT* ReceiveData)
a priklad VB skriptu, kde je volana takto
dim ReceiveData(76)
dim Length
Length = 76 For i = 0 To Length ReceiveData(i) = 0 Next
Sense(ReceiveData(0))
Za kazde postrceni moc dekuji Jiri Binder
Odpovedá: Marek Spisak
12. 8. 2004 12:01
j.binder@albacon.cz wrote:
>mam problem s volanim metody COM objektu pres ktery se nejak nemuzu prenest
(D7 Pro + Update).
>Kdyby mi nekdo mohl poradit, byl bych moc vdecny.
>
>Metoda je deklarovana
>
> function Sense(var ReceiveData: OleVariant): Integer; dispid 17;
>
>Receive Data ma byt buffer delky 77 bytu
>
>Predopokladal jsem, ze bude fungovat toto:
>
>procedure GetState;
>var
> Buf: OleVariant;
> i: integer;
>begin
> Buf := VarArrayCreate([0..76], varByte);
> for i := 0 to 76 do Buf[i] := 0;
> Sense(Buf);
> ...
>end;
>
>Pri vystupu z procedury mi to hazi chybu
> Variant or safe array is locked
>
>
zkus to takhle
procedure GetState;
var
Buf: OleVariant;
i: integer;
Data: PByteArray;
begin
Buf:= VarArrayCreate([0, 76], varByte);
Data:= VarArrayLock(Buf);
try
for i := 0 to 76 do Data^[i]:= 0;
finally
VarArrayUnlock(Buf);
end;
Sense(Buf);
...
end;
pisu to z hlavy, doufam, ze to pojede... neco podobneho pouzivam (D5 prof).
Marek
Odpovedá: j.binder@albacon.cz
12. 8. 2004 23:00
From: "Marek Spisak" <spishark@post.cz>
> zkus to takhle
>
> procedure GetState;
> var
> Buf: OleVariant;
> i: integer;
> Data: PByteArray;
> begin
> Buf:= VarArrayCreate([0, 76], varByte);
> Data:= VarArrayLock(Buf);
> try
> for i := 0 to 76 do Data^[i]:= 0;
> finally
> VarArrayUnlock(Buf);
> end;
> Sense(Buf);
Diky za odpoved. Zkousel jsem, trochu jsem s tim poexperimentoval. Bohuzel jsme
se nepohnul.
V ruznych variantach volani to hazi chyby dost nahodne, v kazdem pripade v Buf
nic rozumneho neprijde,
a vse konci (casto i padem aplikace) pri vystupu z procedury, tj, pri destrukci
variantu Buf.
Nabyl jsme presvedceni, ze metoda ocekava ne varArray, ale spis pointer na nej.
Neco takoveho v importu type library byt nemuze, tak jsem zacal zkouset
vytvareni objektu za chodu pomoci CreateOleObject. Tam jsem zatim moc neuspel,
protoze objekt vytvorim, k predpokladanym metodam se zna, ale jejich volani
skonci hlaskou katastroficke selhani". Kdyby mi nekdo mohl poradit byl bych dost vdecny.
Zdravi Jiri Binder